#!/usr/bin/env python2.6
# -*- coding: utf-8 -*-
""" Upgrade de firmware para dispositivos con bootloader usbxpress
"""

# lo que sigue: verificar WriteFlash en fw_interface.py
# paso 3: verificar crc
#         verificar polinomio

__version__='0.1'
#import wx
import time
import ctypes as c
from fw_interface import *
from util import *
from intelhex import IntelHex ## http://www.bialix.com/intelhex/
import sys


# leo archivo hex pasado como argumento
if len(sys.argv)<2:
    print 'No se especifica archivo fuente.'
    sys.exit(1)
else:
    ih=IntelHex()
    ih.fromfile(sys.argv[1],format='hex')
    mem_size=ih.maxaddr()-ih.minaddr()+1
    if mem_size>MEMORY_SIZE:
        raise('Archivo demasiado grande.')
    elif ih.minaddr()<APP_START_ADDR:
        raise('Archivo pisa el bootloader')
    else:
        print 'Parseo de hexfile completo.'
        ultima_pag=ih.maxaddr()/PAGE_SIZE+1
        dev_code=ih[ultima_pag*PAGE_SIZE-5]
        app_fw_ver=ih[ultima_pag*PAGE_SIZE-4]*256+ih[ultima_pag*PAGE_SIZE-3]
        if dev_code==DEV_CODE:
            print 'Dispositivo:',MCU_DESC,'valido'
        else:
            raise('Dispositivo no valido')
        
cmd('lsmod | grep -q cp210x && sudo rmmod cp210x')

print 'Dispositivos usb encontrados:', GetDevNo()
pdev=DevList('description')
if pdev<0:
    raise ValueError('No hay dispositivo de interfaz USBXpress')

open_success, handle = Open(pdev)
if not open_success:
    raise ValueError('No se puede abrir dispositivo USBXpress')

if not DeviceInBootloader(pdev):
    datos=app_comm['APP_BL_REQ']
    print "Invocando modo bootloader"
    ##datos=app_comm['APP_LED_BLINK']
    if Write(handle, datos) == len(datos):
        print 'Se escribieron',len(datos), 'datos'

    datos = Read(handle)
    if len(datos)>0:
        s=[]
        for i in range(len(datos)):
            s.append(hex(ord(datos[i])))
        print 'Bytes leidos:', s

    time.sleep(1)
    cmd('lsmod | grep -q cp210x && sudo rmmod cp210x')
    ### hay que volver a obtener un handle válido
    ndev=GetDevNo()
    pdev=DevList('description')
    if pdev<0:
        raise ValueError('No hay dispositivo de interfaz USBXpress')

    open_success, handle = Open(pdev)
    if not open_success:
        raise ValueError('No se puede abrir dispositivo USBXpress')

# ya esta en modo bootloader
res,info=GetDeviceInfo(handle)
print "Info del dispositivo leída"

dev_fw_ver=info.App_FW_ver_high*256+info.App_FW_ver_low
if app_fw_ver < dev_fw_ver and dev_fw_ver != 0xffff:
    print "Esta intentando actualizar una versión mas nueva del firmware con otra mas vieja"
    if not pregunta_sn("Quiere continuar?", True, False):
        raise ValueError('Se suspende la actualización')
print "Escribiendo flash..."

if WriteFlash(handle, info, ih):
    print "Actualización exitosa!!"

print "Reseteando dispositivo ..."
ResetDevice(handle)

# Close()

